home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / sharew / musik / diti_tra.ck / dt_modul.eng / example / hall.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-30  |  6.1 KB  |  237 lines

  1. /* example source for DigiTape module */
  2.  
  3.  
  4. #include "\dt_modul\dt_local.h" 
  5. #include "\dt_modul\dt_defin.h" /* global definitions */
  6.  
  7. #include "hall.d"                 /* DSP programm */
  8. #include "hall.dh"                 /* defines DSP programm */
  9.  
  10. #include "hall.h"                  /* defines resource-file */
  11. #include "hall.r"                  /* dump resource-file */
  12.  
  13. #define ECHO_BUFF_SIZE 0x1e00  /* max. 0x1e00 */
  14. #define NR_REFLECT 10
  15.  
  16. typedef struct
  17. {
  18.     Modul_header mh;
  19.     Modul_globals mg;
  20.  
  21.     int rev_index;        /* index of current parameters */ 
  22.     int    dsp_deltab;     /* alternating: delay/ampl./... */
  23.     int dsp_feedback;   /* vol */
  24.     int dsp_eptr;        /* bufferpointer */
  25.     long buff_adr;         /* buffer address*/
  26. } Rev_globals;
  27.  
  28. static Rsc_info rsc_reverb=
  29. {
  30.     FORM1, TEXT, SOLO, UNLOCK_M, L_BUTT_M, V_M, VS_M, P_M, PS_M
  31. };
  32.  
  33. static Module_info dtm_reverb=
  34. {
  35.     0,
  36.     0, 0, 0, ECHO_BUFF_SIZE,    /* x6 x8 x15 xbuff */
  37.     2, 2*NR_REFLECT, 0, 0,        /* y6 y8 y15 ybuff */
  38.     "Example reverb modul"
  39. };
  40.  
  41.  
  42. /* deltab: long reflector distance in cm
  43. (max. ECHO_BUFF_SIZE !)
  44. long vol for this reflector
  45. ( 1.0 == 1000 )
  46. */
  47. char *texte[]={"Theater", "Club", "Nature", "Chamber", 0L};
  48.  
  49. /* longest delay first */
  50. int deltab[][NR_REFLECT]=
  51. {
  52. {2300, 2150, 2000, 1300, 1200, 1100, 1000, 600, 550, 500},
  53. { 250,  270,  300,  400,  450,  500,  550, 150, 175, 200},
  54.  
  55. {1500, 1400, 1300, 1000, 900, 600, 500, 400, 300, 200},
  56. { 200,  200,  200,  100, 100, 200, 350, 500, 400, 300},
  57.  
  58. {3400, 3200, 3000, 2800, 2600, 2400, 2200, 600, 550, 500},
  59. { 140,  160,  180,  200,  220,  240,  260, 500, 500, 500},
  60.  
  61. {1139,  912,  526,  491,  447,  187,  159,  132,  99,   70},
  62. { 200,  200,  600,  550,  500,  600,  800,  700,  700, 800}
  63. };
  64.  
  65. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++
  66.     click ?
  67. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  68. int    check_reverb_buttons( int button, Rev_globals *glob );
  69.  
  70. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++
  71.     set slot-volume L/R and Echo
  72. +++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  73. void init_reverb_volumes( Rev_globals *glob );
  74.  
  75. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++
  76.     process reverb-type
  77. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  78. void    do_reverb_type( Rev_globals *glob );
  79.  
  80. /*++++++++++++++++++++++++++++++++++++++++++++*
  81.  * recalculate delaytable after frequency
  82.  * an send to DSP 
  83.  *++++++++++++++++++++++++++++++++++++++++++++*/
  84. void load_deltab( Rev_globals *glob );
  85.  
  86. /*+++++++++++++++++++++++++++++++++++++++++++
  87.     Echo-Modul
  88.         LOAD_DSP: dsp source address in x
  89.                   dsp target address in y
  90.                   dsp buffer address in param
  91. +++++++++++++++++++++++++++++++++++++++++++++*/
  92. long cdecl do_module_reverb( int module_action, Rev_globals *glob,
  93.                                                      int x, int y, int param )
  94.  
  95. {
  96.     int button;
  97.  
  98.     switch ( module_action )
  99.     {
  100.         case MOD_GET_VERSION:
  101.         return DTM_VERSION;
  102.  
  103.         case MOD_RSC_INIT:
  104.             dtm_init(    &dtm_reverb, HALL, &rsc_reverb );
  105.         return DTM_VERSION;
  106.  
  107.         case MOD_INIT:
  108.             /* feedback Poti */
  109.             dtm_init_poti( glob, 0, H_POTI, AMPL_M, AMPLS_M, 0);
  110.  
  111.             glob->rev_index = 0;
  112.          break;
  113.  
  114.         case MOD_LOAD_DSP:
  115.             /* dsp data space */
  116.             glob->buff_adr = (long)param;
  117.             glob->dsp_deltab = dm_defvar( 'Y', 8, 2*NR_REFLECT ); /* Delay/Ampl alternating. */
  118.             glob->dsp_feedback = dm_defvar( 'Y', 6, 1 );
  119.             glob->dsp_eptr = dm_defvar( 'Y', 6, 1 ); /* ptr to buffer */
  120.  
  121.             dm_load(    MODUL_HALL,
  122.                                 HALL_QUELLE, x, HALL_ZIEL, y,
  123.                                 HALL_DELTAB, glob->dsp_deltab,
  124.                                 HALL_FBACK, glob->dsp_feedback,
  125.                                 HALL_EPTR, glob->dsp_eptr,
  126.                                 HALL_ESIZE, ECHO_BUFF_SIZE-1,
  127.                                 HALL_EZAHL, NR_REFLECT, -1 );
  128.  
  129.             /* Delaytabelle */
  130.             load_deltab(glob);
  131.  
  132.             /* buffer adress */
  133.             dm_setvar( 'Y', glob->dsp_eptr, &glob->buff_adr, 1 );
  134.         brea2k;
  135.  
  136.         case MOD_CLR_MEMORY:
  137.             dsp_setblock( 'X', (int)glob->buff_adr, 0L, ECHO_BUFF_SIZE );
  138.         break;
  139.  
  140.         case MOD_OUT_VOLS:
  141.             /* set volume and echo */
  142.             init_reverb_volumes( glob );
  143.         break;
  144.  
  145.         case MOD_LBUTTONDOWN:
  146.           button = object_find( glob->mh.object_ptr, 0, 10, x, y );
  147.  
  148.             if ( check_reverb_buttons( button, glob ) )
  149.                 return TRUE;
  150.         break;
  151.  
  152.         case MOD_DRAW:
  153.             DialogPrintf( glob->mh.hdialog, SELECHO, texte[glob->rev_index] );
  154.         break;
  155.  
  156.         case MOD_SLIDER_MOVED:
  157.             switch ( x )
  158.             {
  159.                 case 0:
  160.                     /* set echo feedback */
  161.                     dm_setvar( 'Y', glob->dsp_feedback, log_tab_entry(y), 1 );
  162.                 break;
  163.                 default:
  164.                     return FALSE;
  165.             }
  166.         return TRUE;
  167.     }
  168.  
  169.     return FALSE;
  170. }
  171.  
  172. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++
  173.     button pressed ?
  174. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  175. int    check_reverb_buttons( int button, Rev_globals *glob )
  176.  
  177. {
  178.     switch ( button )
  179.     {
  180.         case SELECHO:
  181.             do_reverb_type( glob );
  182.         break;
  183.  
  184.         default:
  185.             return FALSE;
  186.     }
  187.  
  188.     draw_object( glob->mh.object_ptr, button );
  189.     return TRUE;
  190. }
  191.  
  192. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++
  193.     set slot-volume L/R and Echo
  194. +++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  195. void init_reverb_volumes( Rev_globals *glob )
  196.  
  197. {
  198.     /* set echo feedback */
  199.     dm_setvar( 'Y', glob->dsp_feedback,
  200.                             log_tab_entry(glob->mg.potis[0].position), 1 );
  201. }
  202.  
  203. /*++++++++++++++++++++++++++++++++++++++++++++*
  204.  * recalculate delaytable after frequency
  205.  * an send to DSP 
  206.  *++++++++++++++++++++++++++++++++++++++++++++*/
  207. void load_deltab( Rev_globals *glob )
  208. {
  209.     long loc_deltab[2*NR_REFLECT];
  210.     int  *deltab_ptr;
  211.     int i;
  212.  
  213.     deltab_ptr=deltab[glob->rev_index*2];
  214.  
  215.     for (i=0; i<2*NR_REFLECT; )
  216.     {
  217.         loc_deltab[i++] = ECHO_BUFF_SIZE -
  218.                                             (long)*deltab_ptr * glob->mh.sys->Hz / 33000L;
  219.         loc_deltab[i++] = 8388L * *(deltab_ptr++ + NR_REFLECT);
  220.     }    
  221.     dm_setvar( 'Y', glob->dsp_deltab, loc_deltab, 2*NR_REFLECT);
  222. }
  223.  
  224.  
  225. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++
  226.     process reverb-type
  227. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  228. void    do_reverb_type( Rev_globals *glob )
  229.  
  230. {
  231.     if ( texte[++(glob->rev_index)] == 0L )
  232.         glob->rev_index = 0;
  233.  
  234.     load_deltab(glob);
  235.     DialogPrintf( glob->mh.hdialog, SELECHO, texte[glob->rev_index] );
  236. }
  237.